package cn.iocoder.yudao.module.lowcode.core.event;

import cn.iocoder.yudao.module.lowcode.service.magicapi.MagicApiCrudService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * 表配置变更监听器
 * 
 * @author 芋道源码
 */
@Component
@Slf4j
public class TableConfigChangeListener {

    @Resource
    private MagicApiCrudService magicApiCrudService;

    /**
     * 处理表配置变更事件
     * 已禁用：现在通过infra模块的updateCodegen方法直接触发Magic API生成
     */
    // @EventListener  // 已禁用事件监听
    public void handleTableConfigChange(TableConfigChangeEvent event) {
        try {
            log.info("[handleTableConfigChange] 接收到表配置变更事件: table={}, dataSourceId={}, changeType={}", 
                    event.getTableName(), event.getDataSourceId(), event.getChangeType());
            
            // 检查是否启用自动生成 Magic API
            if (!Boolean.TRUE.equals(event.getAutoGenerateApi())) {
                log.info("[handleTableConfigChange] 表 {} 未启用自动生成 Magic API，跳过处理", event.getTableName());
                return;
            }
            
            String tableName = event.getTableName();
            Long dataSourceId = event.getDataSourceId();
            String tableComment = event.getTableComment();
            
            switch (event.getChangeType()) {
                case CREATE:
                case UPDATE:
                case FIELD_CHANGE:
                    // 创建或更新表时，重新生成 Magic API 接口
                    Integer generatedCount = magicApiCrudService.generateCrudInterfaces(tableName, dataSourceId);
                    log.info("[handleTableConfigChange] 表 {} 配置变更，已重新生成 {} 个 Magic API 接口", 
                            tableName, generatedCount);
                    break;
                    
                case DELETE:
                    // 删除表时，删除对应的 Magic API 接口
                    Integer deletedCount = magicApiCrudService.deleteCrudInterfaces(tableName, tableComment);
                    log.info("[handleTableConfigChange] 表 {} 已删除，已清理 {} 个 Magic API 接口", 
                            tableName, deletedCount);
                    break;
                    
                default:
                    log.warn("[handleTableConfigChange] 未知的变更类型: {}", event.getChangeType());
                    break;
            }
            
        } catch (Exception e) {
            log.error("[handleTableConfigChange] 处理表配置变更事件失败: table={}, dataSourceId={}, changeType={}", 
                    event.getTableName(), event.getDataSourceId(), event.getChangeType(), e);
        }
    }
}